# 文件名:   up_day.sh
# 编辑者:   陈浩
# 创建日期: 2025-07-03
# 最后修改: 2025-07-03
# 描述:     DWD,DWS,DM层数据增量更新脚本
# 版本:     1.0
# 变动说明: null
 


#!/bin/bash
set -euo pipefail
# 捕获错误（行号 + 命令）并写入 stderr（已重定向到日志）
trap 'echo "[$(date +"%Y-%m-%d %H:%M:%S")] [ERROR] on line $LINENO: $BASH_COMMAND" >&2' ERR

# —— 日期参数 —— 
dt=$(date -d '-1 days' "+%Y%m%d")

# —— 日志文件 —— 
LOGDIR=/home/hadoop/update
LOGFILE="${LOGDIR}/increment_${dt}.log"
# 确保目录存在
mkdir -p "$LOGDIR"
# 每次运行前删除旧日志并重新生成空日志文件
rm -f "$LOGFILE"
touch "$LOGFILE"

# 从这里开始：stdout 丢弃，stderr 追加到日志
exec 1>/dev/null
exec 2>>"$LOGFILE"

# 写入关键信息，并加时间戳
echo "[$(date +"%Y-%m-%d %H:%M:%S")] [INFO] dt=${dt}" >&2

# 执行函数：参数 $1=标签，$2=SQL 文件路径
run_job() {
  local label=$1
  local sqlfile=$2

  # 日志：开始执行，并加时间戳
  echo "[$(date +"%Y-%m-%d %H:%M:%S")] [INFO] START $label incremental: $sqlfile" >&2


  # -S：Silent 模式，只在出错时输出错误，抑制启动和进度信息。
  # hive.root.logger=ERROR,console：将日志级别设为 ERROR 并输出到控制台，只保留错误日志。
  # dt="$dt"：把脚本里的 dt 传递给 Hive，Hive 脚本中通过 ${hiveconf:dt} 拿到该值，用于增量分区过滤。
  # hive.exec.dynamic.partition=true：开启动态分区功能，允许根据数据自动创建分区目录。
  # hive.exec.dynamic.partition.mode=nonstrict：将动态分区模式设为 nonstrict，允许全动态分区，不强制指定静态分区列。
  # -f "$sqlfile"：指定要执行的 Hive 脚本文件路径，依次执行其中的 SQL 语句。
  
  hive -S \
       -hiveconf hive.root.logger=ERROR,console \
       -hiveconf dt="$dt" \
       -hiveconf hive.exec.dynamic.partition=true \
       -hiveconf hive.exec.dynamic.partition.mode=nonstrict \
       -f "$sqlfile"

  # 日志：成功完成，并加时间戳
  echo "[$(date +"%Y-%m-%d %H:%M:%S")] [INFO] SUCCESS $label" >&2
}

# —— 顺序执行 —— 
run_job "DWD" "/home/hadoop/update/dwdup_day.sql"
run_job "DWS" "/home/hadoop/update/dwsup_day.sql"
run_job "DM"  "/home/hadoop/update/dmup_day.sql"

# 全部完成日志，并加时间戳
echo "[$(date +"%Y-%m-%d %H:%M:%S")] [INFO] ALL jobs finished successfully." >&2
